﻿using System;
using System.IO;
using System.Text;
using System.Xml;

namespace _2019_0921_Batch_Cut_Vedio
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("格式：Batch_Cut_Vedio [转换列表文件路径] [开始截取时间] [结束截取时间] <输出路径>" +
                    "\n\t转换文件列表文件：\"d:\\1.xtl\"" +
                    "\n\t开始截取时间长度：7.5，单位:秒，表示开始截取7.5秒内容去除" +
                    "\n\t结束截取时间长度：10.5，单位:秒，表示从结尾截取10.5秒内容去除" +
                    "\n\t输出路径，可选：\"d:\\\"");
                return;
            }
            else if (args.Length < 3)
            {
                throw new ArgumentException("至少需要3个参数！");
            }

            // 参数1是文件名称
            string filename = args[0];
            // 第二个参数是片头得长度，单位是秒，即1.5是1.5秒
            float startLength = 0;
            // 第三个参数是片尾的长度，单位是秒，即1.5是1.5秒
            float endLength = 0;
            // 输出文件地址，如果有第四个参数，设置为第四个参数，如果没有，为空
            string outputPath = (args.Length >= 4) ? args[3] : string.Empty;

            // 判断第二个参数是否为数值？
            if (!float.TryParse(args[1], out startLength))
            {
                throw new ArgumentException("第二个参数是截取开始多少秒，必须是数值！");
            }
            else if (!float.TryParse(args[2], out endLength))
            {
                // 判断第三个参数是否为数值
                throw new ArgumentException("第三个参数是截取结尾多少秒，必须是数值！");
            }
            else if (string.IsNullOrEmpty(filename))
            {
                //判断第一个参数是否为文件
                throw new ArgumentException("第一个参数不能为空！");
            }
            else if (!File.Exists(filename))
            {
                // 判断文件是否存在
                throw new ArgumentException("指定文件不存在！");
            }

            // 如果所有参数都正确，开始处理
            // 节点内容是否改变，如果改变是true
            bool isUpdate = false;

            // 打开XML文件
            XmlDocument xmlDoc = new XmlDocument();

            // 以UTF-16LE BOM 方式（即Unicode统一码方式）打开文件
            TextReader trd = new StreamReader(filename, Encoding.Unicode);
            xmlDoc.Load(trd);
            trd.Close();

            //获取节点列表 
            XmlNodeList listNode;

            #region 处理Group节点
            // ?判断是否有输出路径
            if (!string.IsNullOrEmpty(outputPath) && Directory.Exists(outputPath))
            {
                // 获取所有group节点，修改输出路径
                listNode = xmlDoc.SelectNodes("//group");

                // 如果是，就遍历所有Group节点
                foreach (XmlElement item in listNode)
                {
                    // 获取原有Group节点输出路径
                    string output = item.GetAttribute("output");

                    // ?判断文件是否存在
                    if (String.IsNullOrEmpty(output))
                    {
                        // 如果文件为空，继续下一个
                        continue;
                    }

                    // 如果文件存在，更换输出路径
                    item.SetAttribute("output",
                        Path.Combine(outputPath, Path.GetFileName(output)));
                }
            }
            #endregion 处理Group节点

            #region 处理track节点
            //获取track节点列表 
            listNode = xmlDoc.SelectNodes("//group//track");
            foreach (XmlElement item in listNode)
            {
                // 设置以帧方式进行寻址，默认是GOC方式
                item.SetAttribute("accuracy", "frame");
            }
            #endregion 处理track节点

            #region 处理clip节点
            //获取clip节点列表 
            listNode = xmlDoc.SelectNodes("//group//track//clip");
            foreach (XmlElement item in listNode)
            {
                // 必须有结束时间
                long stopValue = 0;
                // 判断有结束时间吗？
                if (!long.TryParse(item.GetAttribute("stop"), out stopValue))
                {
                    // 如果没有，下一个
                    Console.WriteLine("clip节点的Stop属性不是数值，将跳过本节点...");
                    continue;
                }

                // 设置开始和结束时间

                item.SetAttribute("start", Convert.ToInt64(startLength * 10000000).ToString());
                item.SetAttribute("stop", (stopValue - Convert.ToInt64(endLength * 10000000)).ToString());

                // 设置已经更新标识
                isUpdate = true;
            }
            #endregion 处理clip节点

            // ?判断是否已经改变
            if (isUpdate)
            {// 如果改变了，就保存
                FileInfo fileInfo = new FileInfo(filename);

                // 不再覆盖原来的列表文件，而是新增一个，命名为xxx_cut.xlt
                string newFileName = string.Format("{0}_cut{1}",
                    fileInfo.FullName.TrimEnd(fileInfo.Extension.ToCharArray()), fileInfo.Extension);

                // 以UTF-16LE BOM 方式（即Unicode统一码方式）打开文件 
                XmlTextWriter tr = new XmlTextWriter(newFileName, Encoding.Unicode);
                tr.Formatting = Formatting.Indented;

                xmlDoc.WriteContentTo(tr);

                tr.Close();

                Console.WriteLine("批量处理成功！");
            }
        }
    }
}